package offer.offer01;

/**
 *
 */
public class S15二进制中1的个数 {
    /**
     * 5, 感觉有很多好的自带的函数可以用。
     */
    public int hammingWeight(int n) {
        int res = 0;
        for(char c: Integer.toBinaryString(n).toCharArray()){
            if(c == '1') res++;
        }
        return res;
    }

    /**
     * 别人的, 这个 &1 操作获取最低位的二进制值, 挺好, 然后 >>> 1右移一位。
     */
    public int hammingWeight2(int n) {
        int res = 0;
        while(n != 0) {
            res += n & 1;
            n >>>= 1;
        }
        return res;
    }

    /**
     * 别人的, 太强了。注意这个 n & n - 1 相当于把n最低位的一个1变成了0, 连右移这种操作都不要了。
     */
    public int hammingWeight3(int n) {
        int res = 0;
        while(n != 0) {
            res++;
            n &= n - 1;
        }
        return res;
    }

}
